6.1 goroutine
Go
语言中,使用的是协程
的概念,也就是goroutine
,可以理解为就是一个轻量级的线程。
协程的开销极低,所以我们可以开启大量的协程支持我们的业务实现,这对于并发要求较高的系统是非常友好的。
本节代码存放目录为 lesson16
使用协程
更多底层的东西Go
语言官方已经为我们封装好了,我们只需要进行使用即可。
在Go
语言中,我们使用go
关键字就可以快速的开启一个协程。如下代码所示:
go func() {
for {
fmt.Printf("当前时间戳: %d\n", time.Now().Unix())
time.Sleep(time.Duration(1) * time.Second)
}
}()
在上面的代码中,我们开启了一个协程,每隔1秒打印一次当前的秒级时间戳。
从上面的代码可以看出,开始的标准格式就是这样的:
go func() {
// 逻辑代码
}()
有的时候,我们会将一些逻辑封装在一个函数中,那么我们可以这样写:
func printNumber() {
for i := 0; i < 100; i++ {
fmt.Printf("printNumber: %d\n", i)
time.Sleep(time.Duration(1) * time.Second)
}
}
在调用的时候,我们通过go
关键词加上函数名称即可,如下所示:
go printNumber()
结合上面的代码,我们的完整示例代码如下:
func main() {
go func() {
for {
fmt.Printf("当前时间戳: %d\n", time.Now().Unix())
time.Sleep(time.Duration(1) * time.Second)
}
}()
go printNumber()
select {}
}
func printNumber() {
for i := 0; i < 100; i++ {
fmt.Printf("printNumber: %d\n", i)
time.Sleep(time.Duration(1) * time.Second)
}
}
执行示例代码输出结果如下:
printNumber: 0
当前时间戳: 1723790742
当前时间戳: 1723790743
printNumber: 1
printNumber: 2
当前时间戳: 1723790744
printNumber: 3
当前时间戳: 1723790745
从结果我们可以看出,已经实现了并发的效果,两个协程都在执行,执行完成后,协程将会进行自动回收。
在上面的示例代码中,我们使用到了select{}
,这是为了保证主程序没有终止,在后续章节我们将进行具体介绍。
小结
Go
语言的协程比较常用且便捷,是我们进行Go
语言开发必须要掌握的知识,这对于之后的深入探索是比较重要的。
关于本节总结如下:
Go
语言具备一种轻量级的线程:协程
通过
go
关键字就可以快速开启协程协程的开销特别小,可以同时开启大量协程来满足需求